/* 批量建表的操作 */
const path = require('path')
const fs = require('fs')

const { query } = require('./db')

// 打印脚本执行日志
const eventLog = (err, sqlFile, index) => {
  if (err) {
    console.log(
      `[ERROR] sql脚本文件: ${sqlFile} 第${index + 1}条脚本 执行失败 o(╯□╰)o ！`
    )
  } else {
    console.log(
      `[SUCCESS] sql脚本文件: ${sqlFile} 第${index +
        1}条脚本 执行成功 O(∩_∩)O !`
    )
  }
}

/**
 * 遍历 sql 目录，获取 .sql 的文件目录
 * @param {string} resolveDir 遍历文件目录
 * @param {string} type 获取文件的类型
 * @return {array} 文件目录名称数组
 */
function getSqlFiles(resolveDir, type) {
  /* 获取 sql 目录下文件列表  */
  const filesArr = fs.readdirSync(resolveDir) || []

  const sqlFiles = filesArr.filter(item => {
    const arr = item.split('.')

    const mime = arr.length > 1 ? arr[arr.length - 1] : ''

    return mime === type
  })

  return sqlFiles.map(item => ({
    file: item,
    path: `${resolveDir}/${item}`
  }))
}

/**
 * 获取 sql 脚本内容
 * @return {array} 文件和内容数组
 */
function getSqlContent() {
  // sql 的目录
  const dirPath = path.resolve(__dirname, '../../sql')

  const sqlFiles = getSqlFiles(dirPath, 'sql')

  const sqlContent = sqlFiles.map(item => {
    const content = fs.readFileSync(item.path, 'binary')
    return {
      content,
      file: item.file
    }
  })

  return sqlContent
}

function createTables() {
  const contents = getSqlContent()

  contents.forEach(item => {
    /* 指令集合 */
    const sqlShellList = item.content.split(';')

    /* 执行指令列表 */
    sqlShellList.forEach(async (shell, i) => {
      if (shell.trim()) {
        const result = await query(shell)
        if (result.serverStatus * 1 === 2) {
          eventLog(null, item.file, i)
        } else {
          eventLog(true, item.file, i)
        }
      }
    })
  })

  console.log('sql 脚本执行结束')
  console.log('请按 ctrl + c 键退出')
}

createTables()
